Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cranelift: Make heap_addr return calculated base + index + offset #5231

Merged
merged 3 commits into from
Nov 9, 2022

Conversation

fitzgen
Copy link
Member

@fitzgen fitzgen commented Nov 8, 2022

Rather than return just the base + index.

(Note: I've chosen to use the nomenclature "index" for the dynamic operand and "offset" for the static immediate.)

This move the addition of the offset into heap_addr, instead of leaving it for the subsequent memory operation, so that we can Spectre-guard the full address, and not allow speculative execution to read the first 4GiB of memory.

Before this commit, we were effectively doing

load(spectre_guard(base + index) + offset)

Now we are effectively doing

load(spectre_guard(base + index + offset))

Finally, this also corrects heap_addr's documented semantics to say that it returns an address that will trap on access if index + offset + access_size is out of bounds for the given heap, rather than saying that the heap_addr itself will trap. This matches the implemented behavior for static memories, and after #5190 lands (which is blocked on this commit) will also match the implemented behavior for dynamic memories.

@github-actions github-actions bot added cranelift Issues related to the Cranelift code generator cranelift:meta Everything related to the meta-language. labels Nov 9, 2022
Rather than return just the `base + index`.

(Note: I've chosen to use the nomenclature "index" for the dynamic operand and
"offset" for the static immediate.)

This move the addition of the `offset` into `heap_addr`, instead of leaving it
for the subsequent memory operation, so that we can Spectre-guard the full
address, and not allow speculative execution to read the first 4GiB of memory.

Before this commit, we were effectively doing

    load(spectre_guard(base + index) + offset)

Now we are effectively doing

    load(spectre_guard(base + index + offset))

Finally, this also corrects `heap_addr`'s documented semantics to say that it
returns an address that will trap on access if `index + offset + access_size` is
out of bounds for the given heap, rather than saying that the `heap_addr` itself
will trap. This matches the implemented behavior for static memories, and after
bytecodealliance#5190 lands (which is blocked
on this commit) will also match the implemented behavior for dynamic memories.
Copy link
Member

@cfallin cfallin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks generally really good to me -- thanks for doing this update!

I added some nitpicks on the documentation, some on pre-existing stuff, as I figure it's worth trying to get this really polished and clear; and a few little cleanups elsewhere; but nothing major.

cranelift/codegen/meta/src/shared/instructions.rs Outdated Show resolved Hide resolved
cranelift/codegen/meta/src/shared/instructions.rs Outdated Show resolved Hide resolved
cranelift/codegen/src/legalizer/heap.rs Outdated Show resolved Hide resolved
cranelift/codegen/src/legalizer/heap.rs Outdated Show resolved Hide resolved
cranelift/codegen/src/legalizer/heap.rs Outdated Show resolved Hide resolved
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cranelift:meta Everything related to the meta-language. cranelift Issues related to the Cranelift code generator
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants